package cn.itsource.itsource.config.alipay;

import cn.itsource.itsource.dto.AlipayDto;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

//这个类的创建，必须要交给spring
@Component
public class AlipayService {

    @Autowired
    private AlipayParams alipayInfo;


    /**
     * 这个方法就是用来：统一实现发起支持操作的公共方法
     *
     * @return
     */
    public String createPayUrl(Double total_amount, String body,String out_trade_no,Long shopId) {
        String result = null;
        try {
            //第1步：获得初始化的AlipayClient
            AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl,
                    alipayInfo.getAppid(), alipayInfo.getMerchantPrivateKey(), "json",
                    AlipayConfig.charset, alipayInfo.getAlipayPublicKey(), AlipayConfig.sign_type);

            //设置请求参数
            AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();

            //TODO 注意：如果需要支付完成后，界面进行跳转操作，只需要设置一个return_url即可，无论你返回什么,都可以跳转
            // 原因：当我们设置了同步回调方法后，支付平台解析到你有回调地址，则会立即根据支付完成的状态进行自动跳转
            // 前提：如果我们重写了异步回调地址后，那么return_url的地址要与异步回调地址域名一致！！！
            // 坑：沙箱环境经常不稳定，如果发现2次回调中，有任何一次没有执行，你多重试几次！！！
            alipayRequest.setReturnUrl(AlipayConfig.return_url);
            //异步回调地址
            //TODO 该回调要生效，需要在支付宝开放平台控制台，设置回调地址
            alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

            /** ************************** 下面的参数，是与系统业务关联 ******************* */
            //商户订单号，商户网站订单系统中唯一订单号，必填(这个订单号，是我们自己系统来生成)
//            String out_trade_no = System.currentTimeMillis() + "";
//            System.out.println(">>>>>>>>>>>创建支付订单时，自己后台生成的订单号是：【" + out_trade_no + "】");
            //付款金额，必填（单位：元。所以金额是都没有小数的。金额的支付只会保留2位小数）
            //订单名称，必填：每次支付，订单不允许重复。所以需要自动生成
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String subject = sdf.format(new Date()) + System.currentTimeMillis();

            //下面这种封装参数的方式，是可以使用fastjson进行替换
            AlipayDto alipayBean = new AlipayDto();
            alipayBean.setOut_trade_no(out_trade_no);
            alipayBean.setSubject(subject);
            alipayBean.setTotal_amount(total_amount + "");
            alipayBean.setBody(body);
            //将上面的对象转为json字符串
            alipayRequest.setBizContent(JSONObject.toJSONString(alipayBean));
            //向支付宝开放平台发送请求（就是支付宝返回的 支付界面url地址）--->这个返回的结果是一段  html代码片段
            result = alipayClient.pageExecute(alipayRequest).getBody();
            System.out.println("调用支付宝生成支付二维码接口的响应结果====>" + result);
            return result;
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }

        return result;
    }
}
